﻿using System;
using System.Collections.Generic;
using System.Text;

using Galaxy.ModuleInterface.Events;
using Galaxy.ModuleInterface.Messages;

namespace Galaxy.ModuleInterface
{
    public abstract partial class CGalaxyModule
    {
        /* --------------------------------------------------------------------- */

        #region События

        /// <summary>Новое сообщение у модуля</summary>
        public event NewMessageEventHandler NewMessage;

        #region Вызов

        /// <summary>
        /// Вызов события при наличии нового сообщения
        /// </summary>
        /// <param name="Message">Сообщение</param>
        protected virtual void InvokeNewMessage(IGalaxyModuleMessage Message)
        {
            InvokeNewMessage(Message, null);
        }

        /// <summary>Асинхронный вызыв события наличия нового сообщения</summary>
        /// <param name="Message">Сооббщение</param>
        /// <param name="CallBack">Асинхронный обработчик завершения вызова</param>
        protected virtual void InvokeNewMessage(IGalaxyModuleMessage Message, AsyncCallback CallBack)
        {
            InvokeNewMessage(Message, CallBack, null);
        }

        /// <summary>Асинхронный вызыв события наличия нового сообщения</summary>
        /// <param name="Message">Сооббщение</param>
        /// <param name="CallBack">Асинхронный обработчик завершения вызова</param>
        /// <param name="object">Объект состояния</param>
        protected virtual void InvokeNewMessage(IGalaxyModuleMessage Message,
            AsyncCallback CallBack, object @object)
        {
            if(this.NewMessage != null)
            {
                if(CallBack != null)
                    this.NewMessage.BeginInvoke(this, new NewMessageEventArgs(Message),
                        CallBack, @object);
                else
                    this.NewMessage.Invoke(this, new NewMessageEventArgs(Message));
            }
        }

        /// <summary>Обработчик события нового сообщения другого модуля</summary>
        /// <param name="Module">Отправитель сообщения</param>
        /// <param name="Arg">Аргументы сообщения</param>
        public virtual void ReceiveMessage(IGalaxyModule Module, NewMessageEventArgs Arg)
        {
            if(Arg.Message.Destination.Check(this))
                ProcessMessage(Arg.Message);
        }

        #endregion

        #endregion

        /* --------------------------------------------------------------------- */
    }

}
